package com.booksquare.data;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.booksquare.data.JDBCUtil;

public class HistorialLecturaDao {

	public List<HistorialLectura> obtenerHistorialLecturaPerfil(String sUsuario) {
		Connection connection = null;
		Statement st = null;
		ResultSet rs = null;
		List<HistorialLectura> oListaHistorial = new ArrayList<HistorialLectura>();

		try {
			connection = JDBCUtil.getConnection();
			st = connection.createStatement();

			final String sQuery = "Select Top 3 l.Id_Libro, l.Id_Autor, l.Nombre, l.Isbn, 'Fecha_Lectura'=Convert(varchar(10),h.Fecha_Lectura, 103)"
					+ ", h.Puntaje_Obtenido, l.Id_Categoria, 'NombreAutor' = a.Nombre, 'NombreCategoria' = c.Nombre "
					+ " From Historial_Lectura h "
					+ " Inner Join Libro l on l.Id_Libro = h.Id_Libro "
					+ " Inner Join Autor a on l.Id_Autor = a.Id_Autor "
					+ " Inner Join Categoria c on l.Id_Categoria = c.Id_Categoria "
					+ " Where h.Usuario = '"
					+ sUsuario.trim()
					+ "' Order by h.Fecha_Lectura desc";
			rs = st.executeQuery(sQuery);

			while (rs.next()) {
				oListaHistorial.add(new HistorialLectura(
						new Libro(
							rs.getInt("Id_Libro"), 
							rs.getString("Nombre"), 
							0, rs.getInt("Id_Autor"), rs.getString("Isbn"), 0,
							new Autor(rs.getInt("Id_Libro"), rs.getString("NombreAutor"), 0), 
							new Categoria(rs.getInt("Id_Categoria"), rs.getString("NombreCategoria"), 0)
						), 
						rs.getString("Fecha_Lectura"), 
						rs.getInt("Puntaje_Obtenido")));
			}
		} catch (SQLException ex) {
			throw new IllegalStateException("Error al obtener los libros", ex);
		} finally {
			JDBCUtil.closeResultSet(rs);
			JDBCUtil.closeStatement(st);
			JDBCUtil.closeConnection(connection);
		}
		return oListaHistorial;
	}

	public HistorialLectura registrarLectura(String sUsuario, int nIdLibro)
			throws Exception {
		String cmdLibro;
		String sQuery;
		HistorialLectura oHistorial = null;
		// PreparedStatement pstm;
		Connection connection = null;
		Statement st = null;
		ResultSet rs = null;

		int nOk = 0;
		int nPuntaje;

		try {
			connection = JDBCUtil.getConnection();
			connection.setAutoCommit(false);

			st = connection.createStatement();

			if (nOk >= 0) {

				sQuery = "Select 'Puntaje' = IsNull(l.Puntaje,0)+IsNull(c.Puntaje,0)+IsNull(a.Puntaje,0) "
						+ " From Libro l "
						+ " Inner Join Categoria c on l.Id_Categoria = c.Id_Categoria "
						+ " Inner Join Autor a on l.Id_Autor = a.Id_Autor "
						+ " Where l.Id_Libro = " + Integer.toString(nIdLibro);
				rs = st.executeQuery(sQuery);
				if (rs.next()) {
					nPuntaje = rs.getInt("Puntaje");

					cmdLibro = "Insert into Historial_Lectura (Usuario, Id_Libro, Fecha_Lectura, Puntaje_Obtenido) values ('"
							+ sUsuario
							+ "',"
							+ Integer.toString(nIdLibro)
							+ ", GetDate(), "
							+ Integer.toString(nPuntaje)
							+ ")";

					nOk = st.executeUpdate(cmdLibro);

					if (nOk >= 0) {
						cmdLibro = "Update Usuario set Puntaje = Puntaje + "
								+ Integer.toString(nPuntaje)
								+ " Where Usuario = '" + sUsuario + "'";

						nOk = st.executeUpdate(cmdLibro);
					}

					if (nOk >= 0) {
						sQuery = "Select Top 1 l.Id_Libro, l.Id_Autor, l.Nombre, l.Isbn, 'Fecha_Lectura'=Convert(varchar(10),h.Fecha_Lectura, 103)"
								+ ", h.Puntaje_Obtenido, l.Id_Categoria,'NombreAutor' = a.Nombre, 'NombreCategoria' = c.Nombre From Historial_Lectura h "
								+ " Inner Join Libro l on l.Id_Libro = h.Id_Libro "
								+ " Inner Join Autor a on l.Id_Autor = a.Id_Autor "
								+ " Inner Join Categoria c on l.Id_Categoria = c.Id_Categoria "
								+ " Where h.Usuario = '"
								+ sUsuario.trim()
								+ "' and h.Id_Libro = "
								+ Integer.toString(nIdLibro)
								+ " Order by h.Fecha_Lectura desc";

						rs = st.executeQuery(sQuery);
						if (rs.next()) {
							oHistorial = new HistorialLectura(new Libro(
									rs.getInt("Id_Libro"),
									rs.getString("Nombre"), 0,
									rs.getInt("Id_Autor"),
									rs.getString("Isbn"), 0, new Autor(
											rs.getInt("Id_Libro"),
											rs.getString("NombreAutor"), 0),
									new Categoria(rs.getInt("Id_Categoria"), rs
											.getString("NombreCategoria"), 0)),
									rs.getString("Fecha_Lectura"),
									rs.getInt("Puntaje_Obtenido"));
						}
					}
				}

			}

			if (nOk >= 0) {
				connection.commit();
			}

		} catch (SQLException e) {
			if (connection != null) {
				connection.rollback();
			}
			throw new IllegalStateException("Error al registrar la lectura", e);
		} finally {
			JDBCUtil.closeResultSet(rs);
			JDBCUtil.closeStatement(st);
			JDBCUtil.closeConnection(connection);
		}
		return oHistorial;
	}

}
